package com.cskaoyan.javase.oop2._2polymorphic._2advantage.type;

import javafx.animation.Animation;

import java.util.Scanner;

/**
 * 思考:
 *      方法的实参数据类型,需要和形参数据类型保持完全一致吗?
 *      不需要,当实参数据类型可以自动类型转换到形参数据类型时
 *          该实参就允许传入方法
 *      引用数据类型同样存在自动类型转换,将它套进去,也是可行的
 *      当方法的形参数据类型是一个父类类型时,那么就可以传入它的子类对象(当然它自身父类类型的对象也可以)
 *
 * 既然形参和实参具有以上特点,那么方法的具体返回值和它的返回值类型之间呢?
 *      也同样有这个特点
 *
 * 以上引用数据类型的自动类型转换(向上转型)在方法当中的应用
 * 请大家牢记
 * 以后的开发 每天都能看得到
 *
 * 遗留问题: 方法重写时,子类重写父类的返回值类型,可以怎么重写?
 *      1.void,不能改,必须保持一致.
 *      2.基本数据类型的返回值类型,不能改,必须保持一致.
 *      3.引用数据类型的返回值类型,可以改,但也不是乱改的
 *          当父类方法返回父类类型时,
 *          子类方法可以返回子类类型,,当然也可以保持一致
 *
 * @since 09:47
 * @author wuguidong@cskaoyan.onaliyun.com
 */
public class Demo {
    public static void main(String[] args) {
        test(0.1);
        test(123);
        test(new Father());
        test(new Son());
        test(new Son2());
        test("abc");
        test(new Scanner(System.in));
        test(new int[3]);
    }
    public static void test(double a){}
    public static void test(Father a){}
    // 如果Object做形参类型,那么该方法允许传入所有的对象
    public static void test(Object a){}
    public static Father test(){
        // return new Father();
        return new Son();
    }
    public static Object test2(){
        // return new Father();
        // return new Son();
        // return "abc";
        return new int[3];
    }

}
class Animal{
    Father method(){
        return null;
    }

    Object method2(){
        return null;
    }
}
class Cat extends Animal{
    @Override
    Son2 method() {
        return null;
    }

    @Override
    System method2() {
        return null;
    }
}
class Father{}
class Son extends Father{}
class Son2 extends Father{}